package com.catazy.album.domain.usecase

import com.catazy.album.domain.model.Album
import com.catazy.album.domain.repository.AlbumRepository
import com.catazy.base.domain.result.Result
import com.catazy.base.domain.result.mapSuccess

/**
 * 作者: Tao
 * 日期: 2024/12/23
 * 时间: 14:25
 * 描述: GetAlbumListUseCase类用于处理获取相册列表的请求
 * 它依赖于AlbumRepository来获取数据
 *
 * @param albumRepository 提供相册数据的仓库
 */
internal class GetAlbumListUseCase(
    private val albumRepository: AlbumRepository
) {

    // operator 关键字用于将 invoke 函数声明为操作符重载
    // val getAlbumListUseCase = GetAlbumListUseCase()
    // 这就是普通的调用方式
    // val albums = getAlbumListUseCase.invoke("some query")
    // 以下就是使用操作符重载的方式
    // val albums = getAlbumListUseCase("some query")
    /**
     * 搜索相册并返回结果
     * 如果提供了查询字符串，将使用该字符串进行搜索
     * 只返回包含默认图片的相册
     *
     * @param query 搜索相册的查询字符串，可以为空
     * @return 包含相册列表的结果对象
     */
    suspend operator fun invoke(query: String?): Result<List<Album>> {
        // 从仓库中搜索相册，并对结果进行处理
        val result = albumRepository
            .searchAlbum(query)
            .mapSuccess {
                // 过滤出包含默认图片的相册
                // filter() 是一个扩展函数，用于对集合进行过滤操作。它会返回一个新的列表，其中包含所有满足给定谓词（predicate）的元素
                // 这里的意思是，如果相册的默认图片地址不为空，就都加入新集合
                val albumsWithImages = data.filter { it.getDefaultImageUrl() != null }

                // 返回处理后的相册列表
                copy(data = albumsWithImages)
            }

        // 返回最终的搜索结果
        return result
    }
}
